/**
 * 
 */
package co.com.sed.model.peers;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import co.com.sed.model.beans.Dependencia;
import co.com.sed.model.util.Util;

/**
 * @author MBarros
 *
 */
public class DependenciaPeer {

	private static final String BUSCAR_TODAS_DEPENDENCIAS =
		"SELECT id_dependencia, descripcion FROM dependencia";

	private static final String BUSCAR_DEPENDENCIA  =	
		"SELECT id_dependencia, descripcion FROM dependencia "+
		"WHERE id_dependencia = &id_dependencia";

	private static final String INSERTAR_DEPENDENCIA  =
		"INSERT INTO dependencia(descripcion) VALUES "+
		"('&descripcion')";

	private static final String ACTUALIZAR_DEPENDENCIA =
		"UPDATE dependencia "+
		"SET descripcion = '&descripcion' "+
		"WHERE id_dependencia = &id_dependencia";

	private static final String ELIMINAR_DEPENDENCIA =
		"DELETE FROM dependencia "+
		"WHERE id_dependencia = &id_dependencia";

	
	/**
	 * 
	 */
	public DependenciaPeer() {
		// TODO Auto-generated constructor stub
	}
	
		/**
		 *  busca en la base de datos todos los registros de la tabla "dependencia"
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
		 * 
		 * @return					lista de dependencia
		 * @see         				Dependencia, Statement
		 */
	
	public static ArrayList<Dependencia> buscarDependencias(Statement stmt) {
		ArrayList<Dependencia> dependencias = new ArrayList<Dependencia>();

		String sql = BUSCAR_TODAS_DEPENDENCIAS; //"SELECT id_dependencia, descripcion FROM dependencia";

		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				while (rs.next()) {
					Dependencia dep = new Dependencia();

					dep.setIdDependencia(rs.getInt("id_dependencia"));
					dep.setDescripcion(rs.getString("descripcion")); 
					
					dependencias.add(dep);
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("No es posible consultar la base de datos:"
					+ e.getMessage());
			e.printStackTrace();
		}

		return dependencias;
	}
	
		/**
		 *  busca en la base de datos un registro de la tabla "dependencia"
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
		 * @param idDependencia		id de la dependencia que se desea cosultar
		 * 
		 * @return					dependencia buscada
		 * @see         			Dependencia, Statement
		 */
	
	public static Dependencia buscarDependencia(Statement stmt, int idDependencia) {
		Dependencia dependencia = new Dependencia();

		String sql = BUSCAR_DEPENDENCIA;
		//"SELECT id_dependencia, descripcion FROM dependencia "+
		//"WHERE id_dependencia = &id_dependencia";
		
		
		// se setean los "parametros"
		sql = sql.replaceAll("&id_dependencia", "" + idDependencia);
		
		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				if (rs.next()) {
					dependencia.setIdDependencia(rs.getInt("id_dependencia"));
					dependencia.setDescripcion(rs.getString("descripcion"));
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("No es posible consultar la base de datos:" + e.getMessage());
			e.printStackTrace();
		}

		return dependencia;
	}
	
		/**
		 *  Inserta una Dependencia en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param dependencia		dependencia que se va a insertar en la base de datos
		 *  
		 * @return					void
		 * @throws SQLException		si ocurre un error al insertar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
	
	public static int insertarDependencia(Statement stmt, Dependencia dependencia) throws SQLException {

		int idNuevaDependencia = -1;
		ResultSet rs = null;
		
		
		try {
			String sql = INSERTAR_DEPENDENCIA;
		// se setean los "parametros": &id_cargo, '&cargo', '&fecha_ini', '&fecha_egr', &id_nivel, &id_dependencia, &funcionario

			sql = sql.replaceAll("&descripcion", dependencia.getDescripcion());
								
		stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);
		
		rs = stmt.getGeneratedKeys();
		if (rs.next()) {
			idNuevaDependencia = rs.getInt("id_dependencia");
			Util.print("nuevo registro: " + idNuevaDependencia);
		}
	} finally {
		rs.close();
	}

	return idNuevaDependencia;
	}
		
		
		/**
		 *  Actualiza una dependencia en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param dependencia			dependencia que se va a actualizar en la base de datos
		 * 
		 * @return					void
		 * @throws SQLException		si ocurre un error al actualizar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
	
	public static void actualizarDependencia(Statement stmt, Dependencia dependencia) throws SQLException {
		String sql = ACTUALIZAR_DEPENDENCIA;
		 //se setean los "parametros": &id_dependencia, &descripcion
		sql = sql.replaceAll("&id_dependencia", "" + dependencia.getIdDependencia())
				 .replaceAll("&descripcion", dependencia.getDescripcion());
		stmt.executeUpdate(sql);
	}
	
		/**
		 *  Elimina un Nivel en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param Nivel				cargo que se va a eliminar en la base de datos
		 * 
		 * @return					void
		 * @throws SQLException		si ocurre un error al eliminar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
	
	public static void eliminarDependencia(Statement stmt, Dependencia dependencia) throws SQLException {
		String sql = ELIMINAR_DEPENDENCIA;
		// se setean los "id_dependencia = &id_dependencia";
		sql = sql.replaceAll("&id_dependencia", "" + dependencia.getIdDependencia());

		stmt.executeUpdate(sql);
	}
	
}
